OR
pedido

Vocação X não pode atacar tal monstro

Por OriGM, 01 de nov. de 2013 em Scripts

resolvido
otserv
tibia
script
12
1.3k
OriGMO
01 de novembro de 2013 às 18:48

Olá galerinha,queria pedir um script.

 

Script: Vocação x não pode atacar tais monstros.

Função: Por exemplo,um druid não pode atacar os monstros x ,y e z ,onde fosse configuravel os monstros que não pode ser atacado.

 

+ REP quem puder ajudar.

 

E tenho outro tópico tambem de duvida,quem souber e puder responder ai vai o link.

http://www.xtibia.com/forum/topic/223360-talkaction-que-consiga-usar-item/

Editado Novembro 1 por OriGM

zipter98Z
01 de novembro de 2013 às 19:22

Eu tentei fazer uma coisa meio louca aqui, fiz rapidinho, então não tenho a mínima ideia se vai funcionar :s

function onTarget(cid, target)
 
local voca_id = xxx     --Coloque aqui o ID da vocation.
local monsters = {"xxx", "yyy", "zzz"}     --Monstros que não poderão ser atacados.
 
for a, b in ipairs(monsters) do
if isPlayer(cid) and getPlayerVocation(cid) == voca_id then
if getCreatureTarget(cid) == b then
return false
end
end
end
return true
end

Editado Novembro 1 por zipter98

OmegaO
01 de novembro de 2013 às 19:54

Zipter, acho que você deveria incluir a tag do creaturescripts e mencionar que o cara deveria registrar no login.lua. Além disso, acho que fazer algo bem parecido com o seu, mas usando onCombat ficaria mais abrangente.

 -- Ids das vocations separadas por vírgulas (nesse exemplo 2 - druid e 6 - elder druid)
local vocation_ids = {2, 6}
 -- nome dos monstros que não poderão ser atacados, separados por vírgulas e entre aspas
local monsterNames = {"demon", "hydra", "rat"}

function onCombat(cid, target)
	if not isPlayer(cid) or not isMonster(target) then
		return true
	end
	if isInArray(vocation_ids, getPlayerVocation(cid)) and isInArray(monsterNames, getCreatureName(target):lower()) then
		return false
	end
	return true
end

Cria um arquivo com esse código em creaturescripts/scripts, chamado vocnoattack.lua. Adicione essa tag em creaturescripts.xml:

<event type="combat" name="VocNot" event="script" value="vocnoattack.lua"/>

E adicione essa linha perto dos demais registerCreatureEvent no arquivo creaturescripts/scripts/login.lua

registerCreatureEvent(cid, "VocNot")
zipter98Z
01 de novembro de 2013 às 21:59

Sobre a tag e registrar no login.lua, eu não achei muito necessário informar pq é algo, suponho eu, meio 'óbvio'. Mas tem razão, eu deveria ter incluído estas informações no meu comentário anterior :x

E sobre o onTarget q coloquei, na verdade, como eu nunca fiz algo com onCombat e onTarget, não sabia o que seria mais adequado colocar. Ai tirei como base um script que encontrei aqui no fórum como base e.e

De qualquer maneira, quais os erros que cometi no meu script? Saberia dizer? Pra não cometer o mesmo erro na próxima vez e.e

OmegaO
01 de novembro de 2013 às 23:48

É óbvio para muitos de nós, já acostumados com isso. Mas para iniciantes e OT-Admins sem intimidade com scripting, não é, infelizmente.

O que você fez está certo, mas tem um furo: vai impedir que o jogador torne o monstro seu alvo, mas não vai impedir que ele dê dano no mesmo. Ele ainda poderia receber dano de magias de área. Já com onCombat, qualquer forma de combate é suprimida. Além disso, você limitou a uma vocação por script, deixando mais complicado de editar para as promotions (já que elder druid deriva de druid, creio que as mesmas regras serão aplicadas).

Fora isso, só achei mais simples usar a função isInArray, que é basicamente esse loop que você fez.

KilluaK
02 de novembro de 2013 às 00:31

Pra checar as vocaçoes tambem é facil usar, por exemplo, o isSorcerer(cid) que ja engloba sorcerer e master sorcerer. Ai como cada vocaçao vai ter restriçao a diferentes tipos de monstros, fica mais facil usar o

 

if isSorcerer(cid) then

elseif isDruid(cid) then..........

fitaisolanteF
02 de novembro de 2013 às 01:57

Zipter, tenta dar uma lida nas aulas do Roksas..

 

Lá você aprende o básico para se aplicar em um código:

 

- Identação

- Uso de tabelas e funções.

SkymagnumS
02 de novembro de 2013 às 02:05

Cara, o mais certo é usar onStatsChange, do que onCombat.

OriGMO
02 de novembro de 2013 às 08:33

 

Zipter, acho que você deveria incluir a tag do creaturescripts e mencionar que o cara deveria registrar no login.lua. Além disso, acho que fazer algo bem parecido com o seu, mas usando onCombat ficaria mais abrangente.

 -- Ids das vocations separadas por vírgulas (nesse exemplo 2 - druid e 6 - elder druid)
local vocation_ids = {2, 6}
 -- nome dos monstros que não poderão ser atacados, separados por vírgulas e entre aspas
local monsterNames = {"demon", "hydra", "rat"}

function onCombat(cid, target)
	if not isPlayer(cid) or not isMonster(target) then
		return true
	end
	if isInArray(vocation_ids, getPlayerVocation(cid)) and isInArray(monsterNames, getCreatureName(target):lower()) then
		return false
	end
	return true
end

Cria um arquivo com esse código em creaturescripts/scripts, chamado vocnoattack.lua. Adicione essa tag em creaturescripts.xml:

<event type="combat" name="VocNot" event="script" value="vocnoattack.lua"/>

E adicione essa linha perto dos demais registerCreatureEvent no arquivo creaturescripts/scripts/login.lua

registerCreatureEvent(cid, "VocNot")

Deu certinho o seu Omega,valeu mesmo!

Eu tinha feito conseguido fazer sozinho um script,mas o problema era que se por exemplo se tivesse um "rat" me atacando,que é um monstro que eu nao podia atacar,e tivesse um outro monstro que nao fosse o rat,eu nao podia atacar. Nao sabia como colocar pra só nao atacar o monstro configurado,valeu agora eu sei!

Ah e eu sei como registrar o codigo,pelo menos isso né. rsrs

De precaução coloquei no script,onCombat ,onAttack e onTarget,só pra garantir que nao vai ter brexas para atacar,não tem nenhum problema né? Não deu erro nenhum por enquanto. rs

zipter98Z
02 de novembro de 2013 às 10:25

Keilost, identação eu faço bunitin e talz no notepad++, mas quando eu passo pra cá o script, ele volta ao 'normal'. Ai como sou meio nb, não sei como passar pra cá já identado ._.

se alguém quiser me ajudar, ty

KilluaK
02 de novembro de 2013 às 15:27

Usa o #####, ele identa automaticamente e quando passo pra ca vem certinho

OmegaO
02 de novembro de 2013 às 19:54

Tópico movido para a seção de dúvidas e pedidos resolvidos.

De precaução coloquei no script,onCombat ,onAttack e onTarget,só pra garantir que nao vai ter brexas para atacar,não tem nenhum problema né? Não deu erro nenhum por enquanto. rs

 

Tenta só com onCombat pra não abusar de creaturescripts, que são executados muitas e muitas vezes. Mas não, fora isso, não tem problema.